{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"http://hilpisch.com/tpq_logo.png\" alt=\"The Python Quants\" width=\"35%\" align=\"right\" border=\"0\"><br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Python for Finance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Analyze Big Financial Data**\n",
    "\n",
    "O'Reilly (2014)\n",
    "\n",
    "Yves Hilpisch"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img style=\"border:0px solid grey;\" src=\"http://hilpisch.com/python_for_finance.png\" alt=\"Python for Finance\" width=\"30%\" align=\"left\" border=\"0\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Buy the book ** |\n",
    "<a href='http://shop.oreilly.com/product/0636920032441.do' target='_blank'>O'Reilly</a> |\n",
    "<a href='http://www.amazon.com/Yves-Hilpisch/e/B00JCYHHJM' target='_blank'>Amazon</a>\n",
    "\n",
    "**All book codes & IPYNBs** |\n",
    "<a href=\"http://oreilly.quant-platform.com\">http://oreilly.quant-platform.com</a>\n",
    "\n",
    "**The Python Quants GmbH** | <a href='http://pythonquants.com' target='_blank'>www.pythonquants.com</a>\n",
    "\n",
    "**Contact us** | <a href='mailto:analytics@pythonquants.com'>analytics@pythonquants.com</a>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Object Orientation and Graphical User Interfaces"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Object Orientation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Basics of Python Classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "uuid": "1ce92033-098b-4e27-9d87-8e2666ec5cea"
   },
   "outputs": [],
   "source": [
    "class ExampleOne(object):\n",
    "    pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "uuid": "b456addd-be22-4c83-8540-83e23537a955"
   },
   "outputs": [],
   "source": [
    "c = ExampleOne()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "uuid": "5b6cf9da-239e-43ae-b08b-a68ce7fa1866"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'<__main__.ExampleOne object at 0x7f77780d0190>'"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.__str__()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false,
    "uuid": "61841014-fc42-4e7b-af9b-7c00726e30f0"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "__main__.ExampleOne"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false,
    "uuid": "02b764ef-2c2e-4b16-a172-3abe15bfe608"
   },
   "outputs": [],
   "source": [
    "class ExampleTwo(object):\n",
    "    def __init__(self, a, b):\n",
    "        self.a = a\n",
    "        self.b = b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false,
    "uuid": "1697f007-4187-458b-9cca-86996f72c187"
   },
   "outputs": [],
   "source": [
    "c = ExampleTwo(1, 'text')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false,
    "uuid": "66a76e9c-3dce-4fa4-a02f-045e18230ce9"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false,
    "uuid": "bdef0545-bdbe-4205-94e8-ff4d8d25da8e"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'text'"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false,
    "uuid": "5e53f978-44c5-48bb-82c8-488e744ee714"
   },
   "outputs": [],
   "source": [
    "c.a = 100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false,
    "uuid": "2886b794-29e2-4650-afff-cb4528f1837b"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "100"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false,
    "uuid": "97cd1970-5234-45ea-a03f-0c2e82713d42"
   },
   "outputs": [],
   "source": [
    "c = ExampleOne()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false,
    "uuid": "8fa2b86a-8182-4689-80b1-a9ddb8aaabeb"
   },
   "outputs": [],
   "source": [
    "c.first_name = 'Jason'\n",
    "c.last_name = 'Bourne'\n",
    "c.movies = 4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false,
    "uuid": "01aaaa84-30eb-4aa1-91f1-45da021090d3"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Jason Bourne 4\n"
     ]
    }
   ],
   "source": [
    "print c.first_name, c.last_name, c.movies"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false,
    "uuid": "8bab6ecc-0164-4cab-99cc-6dd085c6573a"
   },
   "outputs": [],
   "source": [
    "class ExampleThree(object):\n",
    "    def __init__(self, a, b):\n",
    "        self.a = a\n",
    "        self.b = b\n",
    "    def addition(self):\n",
    "        return self.a + self.b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false,
    "uuid": "e1972182-b358-43e0-aa65-5edcb5ff22d2"
   },
   "outputs": [],
   "source": [
    "c = ExampleThree(10, 15)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false,
    "uuid": "d5108fab-7b72-4c84-8d35-e8f10532bcfd"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "25"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.addition()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false,
    "uuid": "ce192d08-30fd-49fa-9332-f7c12b3041fb"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "35"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.a += 10\n",
    "c.addition()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false,
    "uuid": "e7be5636-de6c-445f-ad25-7f0bccfcb848"
   },
   "outputs": [],
   "source": [
    "class ExampleFour(ExampleTwo):\n",
    "    def addition(self):\n",
    "        return self.a + self.b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false,
    "uuid": "174ae69d-a1c4-4181-9be6-76246b171787"
   },
   "outputs": [],
   "source": [
    "c = ExampleFour(10, 15)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false,
    "uuid": "921600a6-6068-473f-9a6f-91df0d5ae8b2"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "25"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.addition()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false,
    "uuid": "a433da66-70d6-4e55-a16f-cb5ceabbc795"
   },
   "outputs": [],
   "source": [
    "class ExampleFive(ExampleFour):\n",
    "    def multiplication(self):\n",
    "        return self.a * self.b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false,
    "uuid": "55e4676e-552d-4c91-98ac-bcda1f1661bd"
   },
   "outputs": [],
   "source": [
    "c = ExampleFive(10, 15)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false,
    "uuid": "a00a11b9-64cb-4b84-937f-d4a08e55a866"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "25"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.addition()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false,
    "uuid": "602e2b76-9282-41fb-a2ae-f5e8f8700542"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "150"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.multiplication()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false,
    "uuid": "7e0ec289-2e12-422e-a6e8-928467ced561"
   },
   "outputs": [],
   "source": [
    "def multiplication(self):\n",
    "        return self.a * self.b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false,
    "uuid": "eef676a7-1aa2-48bb-8df1-faa0d6e376c2"
   },
   "outputs": [],
   "source": [
    "class ExampleSix(ExampleFour):\n",
    "    multiplication = multiplication"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": false,
    "uuid": "b6914c5b-ef2c-4e89-8658-945230a0d8d1"
   },
   "outputs": [],
   "source": [
    "c = ExampleSix(10, 15)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false,
    "uuid": "09c11cdf-8a11-44fc-bfa6-ab7d0e5fb1f0"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "25"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.addition()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": false,
    "uuid": "3d48c537-1b7e-47ca-8265-7ec6d22ccdbb"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "150"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.multiplication()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false,
    "uuid": "8ba30bf1-927d-4f0f-bdff-e52902611f47"
   },
   "outputs": [],
   "source": [
    "class ExampleSeven(object):\n",
    "    def __init__(self, a, b):\n",
    "        self.a = a\n",
    "        self.b = b\n",
    "        self.__sum = a + b\n",
    "    multiplication = multiplication\n",
    "    def addition(self):\n",
    "        return self.__sum"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false,
    "uuid": "5789b7e3-eada-4855-a8e7-835d05841f09"
   },
   "outputs": [],
   "source": [
    "c = ExampleSeven(10, 15)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false,
    "uuid": "cffc73ff-1abd-48d7-8d31-110c5688c8cc"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "25"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.addition()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false,
    "uuid": "4d52d700-8969-4461-84f1-024629dc249a"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "25"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c._ExampleSeven__sum"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": false,
    "uuid": "351770f1-1e91-4d2f-9069-07a828a7b912"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "20"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.a += 10\n",
    "c.a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": false,
    "uuid": "afae2e94-1ff5-4e7e-a17d-a178a4b2db4f"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "25"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.addition()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": false,
    "uuid": "facaf795-8f14-438c-ac4b-50182c55968f"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "25"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c._ExampleSeven__sum"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": false,
    "uuid": "0cf66833-d07e-413a-938a-c6f0f8add274"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "300"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.multiplication()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": false,
    "uuid": "4ac60abf-3801-4c85-9a70-5225c067802e"
   },
   "outputs": [],
   "source": [
    "name_list = ['Sandra', 'Lilli', 'Guido', 'Zorro', 'Henry']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": false,
    "uuid": "7a94a261-2baf-4ab4-9f76-8de755e2dde3"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sandra\n",
      "Lilli\n",
      "Guido\n",
      "Zorro\n",
      "Henry\n"
     ]
    }
   ],
   "source": [
    "for name in name_list:\n",
    "    print name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false,
    "uuid": "8664e0dd-31be-4087-98cd-0631c9f4d156"
   },
   "outputs": [],
   "source": [
    "class sorted_list(object):\n",
    "    def __init__(self, elements):\n",
    "        self.elements = sorted(elements)  # sorted list object\n",
    "    def __iter__(self):\n",
    "        self.position = -1\n",
    "        return self\n",
    "    def next(self):\n",
    "        if self.position == len(self.elements) - 1:\n",
    "            raise StopIteration\n",
    "        self.position += 1\n",
    "        return self.elements[self.position]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": false,
    "uuid": "aac638c0-ded1-4477-8de7-bfe93900d333"
   },
   "outputs": [],
   "source": [
    "sorted_name_list = sorted_list(name_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": false,
    "uuid": "13b327b7-234c-4918-b5c7-ca6b28623ee1"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Guido\n",
      "Henry\n",
      "Lilli\n",
      "Sandra\n",
      "Zorro\n"
     ]
    }
   ],
   "source": [
    "for name in sorted_name_list:\n",
    "    print name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": false,
    "uuid": "8bd47833-fd11-4487-816f-c2dfef6119cd"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "list"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(sorted(name_list))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": false,
    "uuid": "9b89f8ca-bbd1-4b5c-a83c-eac95caa7bb3"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Guido\n",
      "Henry\n",
      "Lilli\n",
      "Sandra\n",
      "Zorro\n"
     ]
    }
   ],
   "source": [
    "for name in sorted(name_list):\n",
    "    print name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "collapsed": false,
    "uuid": "5a2d466c-eb59-4eb4-a2c9-cd715af13944"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "__main__.sorted_list"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(sorted_name_list)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Simple Short Rate Class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "collapsed": false,
    "uuid": "d6fcc0d8-6c79-4a31-8e48-78a38311e688"
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "def discount_factor(r, t):\n",
    "    ''' Function to calculate a discount factor.\n",
    "    \n",
    "    Parameters\n",
    "    ==========\n",
    "    r : float\n",
    "        positive, constant short rate\n",
    "    t : float, array of floats\n",
    "        future date(s), in fraction of years;\n",
    "        e.g. 0.5 means half a year from now\n",
    "    \n",
    "    Returns\n",
    "    =======\n",
    "    df : float\n",
    "        discount factor\n",
    "    '''\n",
    "    df = np.exp(-r * t)\n",
    "      # use of NumPy universal function for vectorization\n",
    "    return df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "collapsed": false,
    "uuid": "8d7ae797-3070-4e98-a516-7c03d219885e"
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": false,
    "uuid": "8febc46f-9d54-4ac9-b4a2-b7b20afd6657"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7f7757614090>"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAEPCAYAAACp/QjLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmczdX/wPHXmbGvI7vISCmDMbaQlL5UklB2ISpE2hek\nUH3bE31/Zacha6iIUGQqLWQZywyyVnbZw2DM+/fHuTN3MMsdc+987p15Px+P+zCfz/0s7znd7nvO\nOZ9zjhERlFJKqeSCnA5AKaWU/9HkoJRS6gqaHJRSSl1Bk4NSSqkraHJQSil1BU0OSimlruDT5GCM\nmWSMOWiM2ZjGMf8zxmwzxqw3xtRKtr+5MWaL670BvoxTKaXUpXxdc/gUaJ7am8aYFsANInIj0BsY\n7dofDHzsOjcM6GyMqerjWJVSSrn4NDmIyE/AsTQOaQVMdh27EggxxpQBbgG2i8huEbkAzARa+zJW\npZRSbk73OVwL/J1se49rX7lU9iullMoCTicHAON0AEoppS6Vy+H77wUqJNsuj60l5L5sfwXX/ksY\nY3RiKKWUugoikuYf5k4nh/lAf2CmMaYBcFxEDhpjjgA3GmNCgX1AR6BzSheI79ie4FmzWVy/OG2a\nHSG4QAG61uhKv3r9uKFwTQ4dgsOH3a/Utg8dgrNnUw4yb14oWdK+SpVy/5zaviJFwGRxfWjYsGEM\nGzYsa2/qp7Qs3LQs3LQs3IwHX1A+TQ7GmBnAHUAJY8zfwFBsrQARGSsi3xhjWhhjtgOngZ6u9+KN\nMf2BJUAwMFFENqd0j+AZs6B6OM1ffZV/zldnyJPVGb1hCuPWjuPWCrfSr24/2tVuR95cedON9/Tp\n9JPI4cOwdav99/TplK+TJ0/6CST5dtGimU8mu3fvztwFshEtCzctCzcti4zxaXIQkRT/2r/smP6p\n7F8ELEr3JsbAK69AWBiFunXjwyHHGTrrGyaZaEatHkXXL7vy7JJnebTWo/Sp24fQkNBUL1WwoH2F\npn7IJc6cSbtWkrhv+3b787//pnyd3LmvTCZpJZeQEAjyh94ipVS2ZQJ5PQdjjFwSf3Q0tGoF//wD\nU6aQ0PZBlu1cxqjVo5i/dT4iQosbW9CvXj/uqXwPwUHBWRrv2bNXJo+0ksvJkylfJzgYSpS4NHmc\nPx9FRESTFGsp11xjz8kpoqKiaNKkidNh+AUtCzctCzdjTLp9DtkrOQAcPAgPPAC//gpDhsDQoRAU\nxN8n/mbcmnGMXzueg6cPEhoSyuN1HueRWo9QsmBJZ36BdJw7Z/NcarWSy5PK8eMpXycoCIoXT792\nkvgqUQJyOd0bpZTymZyZHMB+qz7+OERGwoMPwuTJUKgQAOcvnuerLV8x6vdR/PDnD+QJzkP7sPb0\nrduXWyvc6lFHjT+KioqiUaMmScnEkxrK0aOQ2n/+a65JOWmkllDypt+lk2X0L0Q3LQs3LQs3T5JD\n9vz7MG9emDQJwsPhhRegUSOYNw9CQ8kTnIcO1TrQoVoHYg/HMmb1GCavn8y0jdMILx3O43Uep2t4\nVwrnLez0b5FhuXND2bL25YmLF+HIkfSTybZt8MsvthZz8WLK1ypSxPOaScmSUKCA935vpZT3Zc+a\nQ3JLlkDHjvab84svoHHjKw45ff400zdOZ/Tq0aw7sI5CeQrRtUZX+tbrS3jpcB9FH3gSEuDYsfST\nSfLXhQspX6tAAc+at5x8PFip7CrnNitd7o8/bEf1jh0wahT06pXiYSLCqr2rGL16NLNiZhEXH8et\nFW6lb92+tAtrR75c+bz8G2RvIrZT3dNEcugQxMWlfK08edJu1rr8VayYPtGlVGo0OSR3/Dh07gyL\nF8MTT8CIEbY2kYqjZ48yOXoyY9aM4Y8jf1A8f3F6RvSkT90+3HDNDV76Dbwnu7SnJh9rktYrsW8l\n5Se6oggKauJxJ3yJEvaVxschYGWXz4U3aFm45dw+h5SEhMCCBTBwIHzwAcTEwOef22+HFFyT/xqe\nbfgszzR4hu93fc/o1aMZuXIkH/z6AXddfxeP132c+6vcT+7gbPiN4qCMjjVJ/kRX4uuXX+x/7uSJ\nZNOm9DvhQ0LS73hP/sqf32u/tlJ+J+fUHJKbOhUeewzKlIGvvoKICI9O239qP5PWTWLc2nH8deIv\nyhYqy2O1H6NX7V5UKFoh/QsoxyXvhE/vya7E9+PjU77W5f0mKSWV5Pu8MRJeKW/QZqW0rF4NbdrY\nHtbISGjf3uNTLyZcZNH2RYxZPYZvtn2DMYb7bryPx+s+7sjgOuU7InDihGfJJPGV2hxduXKln0CS\n7yteXMebKN/Q5JCeAwegbVvbDjF4MLz+eoZ7Mf88/ifj1oxj4rqJHDx9kOuKXkfv2r15pNYjlC3s\n4TOlXqDtqW5Ol8Xl06qklFiSb6c2eNEY27HuSa0k8efLm7qcLgt/omXhpsnBE+fO2Q7qiRPh/vtt\nk1ORIhm+zIWLF5i3dR5jVo9h2a5l5ArKReubWvN43cf5T6X/EGR8++iMfvDdAq0sLlxIfbxJSkkl\nrfEmBQtemjTi46OoUaNJikmlRAnbz5JTmroC7XPhS5ocPCViH3F9+mm48UbbD3HTTVd9uW1HtjFu\nzTg+jf6UI2ePULlYZXrX6U3PiJ5+O1WHChwJCba2kTxxpFUz8aSpK6VayOWJJPHf7PhUV06jySGj\noqJs38P58zB9Otx3X6YuFxcfxxebv2DM6jH89NdP5A7KTduwtvSp04c7Kt4RsFN1qMCTvKkrtaSS\n+PM//9inulJTtKhniSTx50KFck7tJFBocrgaf/5pJ+6LjrZ9EC+/7JXRVLGHYxm3ZhyT10/meNxx\nbip+E73r9Obhmg9TvEDxTF9fq8xuWhZuV1sW8fG2qSu15JFSLSW10fCJi2WlVyNJ3hHvi1mE9XPh\npuMcrkbFirBiBfTuDa++CuvW2aeZCmdurqWwkmGMbD6St5u+zezY2YxdM5bnv32eQcsG0S6sHX3q\n9KHxdY21NqH8Qq5cULq0fXlCBE6dSr9Gcviwnajg8GF7fEqSd8SnVSNJ/q/O1eV9WnNIjYgdRf3i\ni1C1qu2HuMG7I6M3HtzIuDXj+GzDZ5w4d4KbS9xM79q96V6zu1dqE0r5s3PnrhxzklLtJPm+1Dri\n8+e/dLR7erWTnLbGyeW0Wckbli61E/clJMCMGdC8uddvcebCGT6P+Zyxa8by257fyBucl3Zh7ehd\np7fWJpRySUi4csxJ4tNbqSWYtGonidPSe5JMslvtRJODt+zaZQfMbdwI//0vDBrksx629QfWM27N\nOKZunMrJcyc9rk1oe6qbloVbTi+LuDh3Alm2LIpy5ZqkmUw8rZ148m+xYv5bO3E8ORhjmgMjgWBg\ngoi8e9n7xYBJwPVAHPCIiMS43tsNnAQuAhdE5JYUrp81yQHsjHC9etnaw4MPeqUfIs3bnT+d1Dfx\n257fyBOcx9Ymavfm9oq3X1GbyOlfAslpWbhpWbh5UhbJayee1EwyUjtJnjxS+7lgwax5ssvR5GCM\nCQa2As2AvcDvQGcR2ZzsmPeBkyLyhjHmJuATEWnmem8XUEdEUn2oLkuTA9h+iJEjbT9ElSq2H6JK\nFZ/fdsPBDYxfMz6pb+Km4jfRq3YvutfsruMmlHJYXNylT3al1X+SeFxq83Ulf7LLk2RSvPjVjTtx\nOjk0BIaKSHPX9kAAEXkn2TELgHdEZIVrezvQUEQOu5JDXRE5ksY9sjY5JFq+HDp0sOMhpk2Dli2z\n5LaJfRPj147nl79/IXdQbh6s+iC96/SmSWgTn4/CVkplXuJ8XanVRFJKKilPTW+FhHiWSBJ/LlIE\ngoKcTQ7tgHtEpJdruytQX0SeTHbMm0B+EXnOGHML8DNwi4isM8bsBE5gm5XGisj4FO7hTHIA+Osv\n27y0Zg0MHQpDhmTp6jIxh2IYv3Y8U9ZP4VjcMcr9U46nOj5Fj4gelC7k4fOH2ZQ2pbhpWbgFclmc\nP++udXiaVM6fT/lauXPDhQvOjnPw5Fv7HeAjY8w6YCOwDpsMAG4TkX3GmJLAd8aYLSLy0+UX6NGj\nB6Guyf9DQkKIiIhI+gBERUUB+Gb7uuuIevNNGDGCJq+9BmvWENWnDxQqlCX3r1aqGm3ytaFF3RYc\nLnmY96a/x8AJA3k56GXaNG9Dr9q9yP1XboKDgrOmPPxoO5G/xOPkdnR0tF/F4+R2dHS0X8WTke08\neWDrVrt9553pHy8CixZFceIE3HBDE5Yti2LBgkjOnYO8eUP5+WfS5cuaQwNgWLJmpUFAwuWd0ped\nswuoISL/XrZ/KPCviAy/bL9zNYdEIjB6tJ2XqWJF+PJLqFHDkVC2/rOVCWsnELk+kn/O/EPFohV5\ntNaj9KzVk/JFyjsSk1LK/zjd55AL2yHdFNgHrOLKDumiwFkROW+M6QU0EpEexpgCQLCInDLGFAS+\nBV4TkW8vu4fzySHRzz/beZlOnLAzvHbq5Fgo5+LPMW/rPMavHc/SnUsJMkG0uLEFj9V6jPuq3Eeu\nIB0Yr1RO5kly8FkjuYjEA/2BJUAsMEtENhtj+hhj+rgOCwM2GmO2APcAT7v2lwZ+MsZEAyuBBZcn\nBr/TqJHtf6hd265V/dxzqU824wPJm1Ty5spLh2od+K7bd+x4agcDGw1kzb41tJnVhutGXMfgZYPZ\neWxnlsWW1S5vXsrJtCzctCwyRgfBeduFC/DCC/C//8Edd8CsWZ5PUJMJUel0tsUnxPPNtm8Yv3Y8\n32z7hgRJoGmlpjxW+zEeuPkB8ubK6/MYs0p6ZZGTaFm4aVm4OT4Iztf8MjkkmjrVTt5XrBjMmQMN\nGzodUZI9J/cQGR3JhLUT+PPEnxTPX5xu4d14rPZjVCtVzenwlFI+psnBaevX28dd//7bTuLXr59f\nTWyfIAks3bmUCWsn8NWWr7iQcIEG5RvQq3YvOlTrQKE8hZwOUSnlA472OSigZk1YvRruvhv694fu\n3e00HD5wNe2pQSaIuyvfzeftP2fvc3sZfvdwTsSd4NH5j1J2eFl6f92bVXtX4dcJOAXatuymZeGm\nZZExmhx8rVgxmD8f3njDjqZu2BC2b3c6qiuULFiS5xo+R0y/GH5+5Gfah7Vn2sZp1J9Qn/Ax4Xz0\n20ccOZPqYHWlVDajzUpZackS6NLFTvs4ZQq0auV0RGk6ee4kMzfNZMLaCfy+73fyBOfhgZsf4NFa\nj9L0+qY6XYdSAUr7HPzR7t3Qrp197PXll+1SpP46r28yGw5uYOLaiUzdOJWjZ48SGhJKz4ie9Izo\nSYWiFZwOTymVAdrn4I9CQ+0ypI89Bm+9BffcA4cOZfqyvm5PDS8dzkf3fsTe5/Yyo+0MKherzNCo\noVQcWZHmU5szO2Y25+LP+TQGT2nbspuWhZuWRcZocnBCvnwwfjxMmmRHVteuDb/84nRUHsmXKx+d\nqndiafel7HxqJ6/c/goxh2PoMKcD5UeU59nFz7Lp0Canw1RKZZI2KzktOhratrWzvA4fDk8+6VeP\nu3riYsJFvtv5HRPXTWTelnlcSLjALdfewqO1HqVT9U4UyVvE6RCVUslon0OgOH4cHn7YPtXUsSNM\nmACFAnOMweHTh5m6YSoT100k5nAM+XPlp3219jxa61FdD1spP6F9DoEiJMTO5vrOOzB7NtSrB7Gx\nGbqEv7SnlixYkmcbPsvGvhtZ+dhKuoV348vNX3JH5B1U+bgKb//0NntP7vVpDP5SFv5Ay8JNyyJj\nNDn4i6AgGDAAli6Fo0dtgpg+3emorpoxhluuvYWx949l//P7mdxmMuUKl+Pl71/mupHXcd/0+5gb\nO5fzF1NZkUQp5ShtVvJH+/bZ5qUVK6BvXzv1Rt7sMTHetiPbiIyOJHJ9JPtO7aNEgRJ0C+/GI7Ue\noXqp6k6Hp1SOoH0OgezCBRg8GN5/H+rUsc1NlSo5HZXXXEy4yLc7vmVS9KSkTux65erRM6InnWt0\nJiRfiNMhKpVtaZ9DIMudG957D776yk63Ubs2fP11qocHWntqcFAw9954L7Pbz2bf8/sYec9I4uLj\n6PdNP8oOL0uXuV34bsd3JEhChq8daGXhS1oWbloWGaPJwd+1bg1r19paQ6tWMHAgxMc7HZVXlShQ\ngqcbPM36x9ezutdqHq31KIu2L+LuqXdT6aNKDFk+JFsvTqSUP9JmpUARF2fXqR43Dm6/HWbMgHLl\nnI7KZ+Li45i3ZR6Toifx3Y7vEIQmoU3oGdGTtlXbUjBPQadDVCpgaZ9DdjR1KvTpAwUL2lle77rL\n6Yh87u8TfzNl/RQ+jf6UHcd2UDhPYTpW60jPWj1pWL6hjp1QKoO0zyE76toVfv8dSpa08zINGwYX\nL2br9tQKRSsw+PbBbHtyGz/0+IG2YW2ZsWkGjSY1ouonVXlnxTuXjJ3IzmWRUVoWbloWGePT5GCM\naW6M2WKM2WaMGZDC+8WMMV8aY9YbY1YaY6p5em6OFhYGq1ZBt27w2ms2SRw96nRUPmeM4faKt/Np\n60858MIBJrWaRKmCpRi0bBDXjbyOe6fdy+cxn+vYCaW8wGfNSsaYYGAr0AzYC/wOdBaRzcmOeR84\nKSJvGGNuAj4RkWaenOs6P+c1KyUnAp9+Ck88YUdZz5wJd9zhdFRZbvvR7URGRzJ5/WT2nNxDsXzF\n6Fy9Mz0ielC3XF1tdlLqMo72ORhjGgJDRaS5a3sggIi8k+yYBcA7IrLCtb0duBWonN65rv05Ozkk\n2rAB2re3j7y+/joMGmRHXOcwFxMu8v2u74lcH8kXm78gLj6OsJJh9IzoSdfwrpQpVMbpEJXyC073\nOVwL/J1se49rX3LrgQcBjDG3ABWB8h6eqxKFhxM1YoQdVf3KK9C8uVfWiAg0wUHB3FX5Lnpd04v9\nz+9nzH1jKJq3KC9+9yLlPyxPy+ktmRM7x2/WncgK2s7upmWRMbl8eG1P/qR/B/jIGLMO2AisAy56\neC4APXr0IDQ0FICQkBAiIiJo0qQJ4P4w5IjtAgWI6tULypWjyccfQ0QEUS+9BDmwPABC8oVw0783\n8VbltyjbuiyT109m/NzxLPx2IcWqFqNLjS7UOFODKsWrcOedd/pV/N7cjo6O9qt4nNyOjo72q3iy\ncjsqKorIyEiApO/L9PiyWakBMCxZ09AgIEFE3k3jnF1ADaC6J+dqs1Iq1q+HDh1sM9OwYXY50gBY\nitTXLiZcZNmuZURGR/Llli+Ji4+jWslqPFzzYbqGd6Vs4bJOh6hUlnC6zyEXtlO5KbAPWMWVHdJF\ngbMict4Y0wtoJCI9PDnXdb4mh9ScOgWPP25ndm3WzI6PKF3a6aj8xvG443we8zmR0ZH8uudXgkwQ\n91S+hx4RPWh1Uyvy5crndIhK+YyjfQ4iEg/0B5YAscAsEdlsjOljjOnjOiwM2GiM2QLcAzyd1rm+\nijU7SN6kAkDhwjYhjB9vZ3eNiIDvv3cktqx2RVmkICRfCL3r9OaXR39ha/+tDGw0kI2HNtJxTkfK\nDi/L4wse59e/fyXQ//jwpCxyCi2LjNER0tlEVFRUUlvjFTZssJ3VW7fCq6/CkCHZupkpzbJIw8WE\niyzfvZzJ6yczN3YuZ+PPUqV4FbqHd6dbzW5cV/Q67wfrY1dbFtmRloWbTp+h3P79F/r3h8mT7ViI\nadPgWn0ALDWnzp1iTuwcItdH8uOfP2Iw3FnpTh6u+bDO7aQCniYHdaUpU6BfP8if3yaKFi2cjsjv\n7Ty2k8/Wf8aUDVPYeWwnBXMXpF1YOx6u+TB3hN5BkMl5Y0pUYHN6nIPKQh63p3bvDqtX2xld77sP\nXnrJLiyUjXi7bfn6YtcztMlQtj+5nR97/Ein6p34YvMX/GfKf6j0USVe+f4Vth3Z5tV7eou2s7tp\nWWSMJoec6Oab4bff7NNM778PjRvDrl1OR+X3jDE0rtiYCa0mcOCFA0x/cDphJcN4e8XbVPm4CrdO\nvJUxq8dw9Gz2n+dKZX/arJTTzZ4Njz0Gxtgnm9q3dzqigLPv1D6mbZjGlA1T2HRoE3mC83B/lft5\nuObDNL+hObmDczsdolKX0D4H5Zldu6BzZ1i50q4VMWKE7ZNQGSIiRB+IZsr6KUzbOI3DZw5TokAJ\nulTvQrea3ahTto5OAqj8gvY55CCZak+tVAl++gkGDICxY6FePYiJ8VpsWc2ptmVjDLXK1mJE8xHs\nfW4vCzov4M7QOxm7Ziz1xtej2qhqvLPiHf4+8Xf6F/MSbWd307LIGE0OysqdG955B5YsgcOHbYKY\nMMFOC64yLHdwbu6rch+ft/+cAy8cYFzLcRQvUJxBywZRcWRFmk5pSmR0JKfOnXI6VKVSpM1K6koH\nDtinmr77zs7RNHasXS9CZdrOYzuZumEqU9ZPYcexHeTPlZ8Hqj5At/BuNLu+GbmCfDkXplKW9jmo\nq5eQAO+9Z0dUX3utnaPp1ludjirbEBF+2/MbU9ZPYVbMLI7FHaNMoTJJ/RM1S9fU/gnlM9rnkIN4\nvT01KAgGDrTzMgUFwe23w5tvwsWL3r2PDwRC27IxhoYVGjK65Wj2P7+fuR3m0qB8A/5v1f9Ra2wt\nwseE897P712yNvbVCISyyCpaFhmjyUGlrX59WLfONi+98oqd4XXPHqejylby5srLg1Uf5MuOX7L/\n+f2MajGKQnkKMWDpACqMqECzKc2YHD1Z+ydUltJmJeUZETv1xhNPQN68MGkStG7tdFTZ2rYj25i2\ncRqfbfiMncd2kj9Xftrc3IZu4d24q/Jd2j+hrpr2OSjv++MPOyZi7Vo7R9MHH+iYCB8TEX7d8ytT\nN0xlVswsjp49SqmCpehcvTNdw7vq+AmVYdrnkINkWXtqlSrwyy/w/PMwapR95HXjxqy5t4eyW9uy\nMYZbK9zKqPtGsf/5/XzZ8Utuu+42Rq8eTb3x9QgbFcabP77JrmNXToGS3coiM7QsMibN5GCMyWWM\n2ZpVwagAkTevrTEsWQL//GMTxMcf65iILJAnOA9tbm7D3A5zOfC8HT9RqmApXln+Ctf/73oaf9qY\nsavH6vxOKtPSbVYyxswDnhKRP7MmJM9ps5IfOHQIHnkEFi60s7x++imULOl0VDnO7uO7mb5xOp9t\n+Iwt/2whd5AdhNe1Rlfuq3KfLnuqLuGVPgdjzE9ALew6zqddu0VEWnklykzQ5OAnROCTT+CFF6BY\nMbtOxN13Ox1VjiQirN2/lmkbpzFj0wwO/HuAonmL0i6sHV3Du3J7xdt1/QnlteTQxPVj4oEGmxx+\nyHSEmaTJwc0vlkDcuNF2VsfEwHPPwVtv2SaoLOYXZeEH4hPiGTFjBJsKbmJu7FxOXzhN+SLl6VK9\nCw+FP0R46XCnQ8xS+rlw80qHtIhEAVuAIkBhINbTxGCMaW6M2WKM2WaMGZDC+yWMMYuNMdHGmE3G\nmB7J3tttjNlgjFlnjFnlyf2Uw2rUgN9/t4+7fvihHSMRG+t0VDlWrqBc1Lu2HpPbTObgCweZ/uB0\napauyfBfh1NzTE3CR4fz7op3s3QiQBU4PKk5dADeBxITwu3AiyIyO53zgoGtQDNgL/A70FlENic7\nZhiQV0QGGWNKuI4vLSLxxphdQB0RSbVnTWsOfmzhQujZE06dguHDoW9fu2aEctzh04f5POZzpm2c\nxq97fgXgjop38FCNh2gX1o5i+Ys5HKHyNW81K20AmonIIdd2SWCZiKRZJzXGNASGikhz1/ZAABF5\nJ9kxfYBwEXnCGHM9sFhEqrje2wXUFZEjadxDk4M/O3jQJohFi2xn9aRJUKqU01GpZHYc3cH0jdOZ\ntnEaW49sJXdQblrc2IKHajxEyyotyZ9bx7BkR94a52CAw8m2j7j2pedaIHl9dY9rX3LjgWrGmH3A\neuDpZO8JsNQYs9oY08uD++VofvkMd+nStgbxf/8HS5faZqdFi3x+W78sC4ekVxaVr6nMq3e8yuYn\nNrO612r639KfVXtX0WFOB0p/UJqe83ry3Y7vuJjg/3NqpUc/Fxnjyfj7xcASY8x0bFLoCHjyf7gn\nf9K/DESLSBNjTGXgO2NMTRE5BTQSkf2umsp3xpgtIvLT5Rfo0aMHoaGhAISEhBAREZHU6ZT4YdBt\nh7f794cmTYhq1QpatKDJE0/A++8TtXKlT+6XyG9+fwe3o6OjPTreGMOpP07RKm8r3n/2faJ2R/HB\n9A/4fOHnREZHUqZQGRpdbESzSs3o064Pxhi/+P0ysh0dHe1X8WTldlRUFJGRkQBJ35fp8Wj6DGNM\nW6CRa/MnEfnSg3MaAMOSNSsNAhJE5N1kx3wDvCkiP7u2lwEDRGT1ZdcaCvwrIsMv26/NSoEkLg5e\nftkuQ1q1KkybBrVqOR2VSsPZC2dZuG0h0zdOZ+G2hZy/eJ4br7mRLjW60KVGF6oUr+J0iOoqeKvP\n4V0RGZDevhTOy4XtYG4K7MOOk7i8Q/pD4ISIvGaMKQ2sAcKBOCBYRE4ZYwoC3wKvici3l91Dk0Mg\nWroUHn7Yrjj3xht2fERwsNNRqXQcjzvO3Ni5TN80neW7liMIdcvVpUv1LnSs3pFyhcs5HaLykLf6\nHFIazdQivZNEJB7oDywBYoFZIrLZGNPH1REN8BZQ1xizHlgKvOR6OqkM8JMxJhpYCSy4PDGoS13e\npOLXmjWzYyJat7ZrRjRtCn/95bXLB1RZ+Jg3yyIkXwiP1n6UZd2Xsee5PQy/ezgJksBz3z5H+Q/L\n03RKUyauncixs8e8dk9v0s9FxqRaczDG9AX6AZWBHcneKgz8LCIP+T68tGnNwS0qEAf4JE4D3r+/\nrTmMGgVdumT6sgFZFj6SFWWx9Z+tzNg0g+kbp7Pt6DbyBOfh3hvupUuNLrSs0pICuQv49P6e0s+F\nW6aalYwxRYFiwDvAANxPKJ1K6/HSrKTJIZvYuRO6dbOzvXbqZJNEMX3WPtCICGv2r2HGxhnM2DSD\n/f/up1CeQrS5uQ1dqneh2fXNyB2c2+kwFd7rc2gIxIjISdd2EaCqiKz0WqRXSZNDNhIfD+++C8OG\n2UdgJ0+2zU0qIF1MuMgPf/7AjI0zmLN5DsfjjlM8f3Hah7WnS40uNLqukc7x5CBv9TmMBv5Ntn0a\nGJOZwJR4hdOtAAAgAElEQVT3BXx7aq5cMHgw/PYbFC5s+yWefRbOns3wpQK+LLzIqbIIDgrmP5X+\nw/hW4znw/AHmdZrHXZXvYvL6ydweeTuhI0N58dsXWbt/LVn1B55+LjLGo9QtIgnJfr4I6KMlyjfq\n1IE1a+DJJ2HkSKhbF1zPp6vAlDdXXlrd1IoZbWdw6MVDTHtwGuGlwxm5ciR1xtWh6idVGRY1jK3/\n6NIx/sSTZqUvgeXYGoQB+gJ3ikgb34eXNm1Wyua+/dZOv3H4MLz+Orz4oj7ymo0cOXOEuZvnMmPT\nDH7Y/QOCUKtMLTpX70zH6h25ruh1ToeYbXmrz6E08D/gTteuZcDTiXMtOUmTQw5w9Cg8/jjMng2N\nGtm+iMqVnY5Kednek3v5POZzZmyawe/7fgegUYVGdK7emfbV2lOqoM7J5U1eSQ7+TJODW7Z+TE8E\npk+3U4HHx9vpwHv1SnWW12xdFhkUiGWx4+gOZm6ayYxNM4g5HEOQCaJppaZ0rt6ZB6o+QEi+kKu6\nbiCWha94pUPaGJPfGNPfGDPKGDMp8eW9MJVKhzHw0EN24FyDBtCnD7RsCfv3Ox2Z8oHK11Rm8O2D\n2dRvExv7bmRgo4HsOLaDR+Y/QukPStN6ZmtmbprJ6fOn07+YumqeNCvNATYDDwGvAV2BzSLylO/D\nS5vWHHKghAS7JOlLL0HBgjBmDLRr53RUysdEhN/3/c7MTTOZFTOLfaf2USB3Ae6vcj+dqnei+Q3N\ndZ3sDPBWn0O0iEQYYzaISLgxJjewQkTqezPYq6HJIQfbsgW6d7crzz30kJ0WXAfO5QgJksCKv1Yw\nc9NMZsfO5p8z/1AkbxEeuPkBOlbrqIPtPOCtcQ7nXf+eMMbUAEKAkpkNTnlXjnuG++ab4eef7aC5\nmTOhenVYsgTIgWWRhuxYFkEmiNsr3s6o+0ax//n9LOm6hAerPshXW76ixfQWlB1elt5f9+b7Xd9f\nsg5FdiwLX/IkOYwzxlwDvALMx06i955Po1LKE7lzw9ChsHIlhIRA8+Z2OdKrGDinAlOuoFzcXflu\nPm39KQdfOMi8TvO454Z7mL5xOk2nNOXaD6/lyW+eZMVfK0hwD9dSHkhrbqWnReQjY8xtIrIii+Py\niDYrqSRxcfDKK/ZJpkqV7COvt93mdFTKIWcunGHhHwuZFTOLhdsWEhcfR/ki5ekQ1oGO1TtSr1w9\nTA5e0zyzE++tF5Gaxph1IuKXK7JoclBX+PFH6NEDdu+G55+360Xk047KnOzkuZPM3zqfWTGzWLJ9\nCRcSLlAppBIdqnWgU/VO1CxdM8cliswmhxlAXey6zzsue1tEJNwrUWaCJgc3fYbbLeqbb2gybx6M\nGwdhYbYWUbeu02E5Qj8XblFRUdSsX5OvtnzFrJhZLN25lItykSrFq9CxWkc6VOtA9VLVnQ4zS2Sq\nQ1pEOgONge1AS+D+ZK9WXoxTKe8qUADGjoVFi+DECTs24tVX4fz59M9V2Vqx/MXoWasni7su5sAL\nBxjbcizli5TnzZ/epMboGlQbVY3Xf3hd53lCR0ir7O7YMXjmGbuoUM2a9t9wxyu9ys8c+PcAc2Pn\nMitmFiv+WoEg1Cxdkw7VOtChWgduuOYGp0P0Kp0+Q6lE8+ZB7942WQwdCgMG2GnClbrM3pN7mRM7\nh1kxs/h1z68A1C5bmw5hHWhfrT3XF7ve4QgzT5NDDqJty26plsU//9j5mT7/3PZBTJ5s+ySyMf1c\nuF1NWfx14i/mxM7h85jPWbnXrm9Wt1zdpEQRGhLq/UCzgLfmVmrvyb5Uzm1ujNlijNlmjBmQwvsl\njDGLjTHRxphNxpgenp6rVIaVKAGzZtnXrl1Qu7ZdfS4+3unIlJ+6ruh1PNfwOX577Dd2Pb2L9+96\nH4CXlr5EpY8qUX9CfYb/Mpy/TvzlcKTe58n0GVc8yurJ463GmGBgK9AM2Av8DnQWkc3JjhkG5BWR\nQcaYEq7jSwOS3rmu87XmoK7OwYN2wNyXX0L9+hAZaUddK+WBncd2JtUo1uxfA0CD8g3oENaBdmHt\nqFC0gsMRpi2zj7LeC7QAOgIzsQv9ABQGwkTklnRu3hAYKiLNXdsDAUTknWTH9AHCReQJY8z1wGIR\nqeLJua79mhzU1ROxU2/07w+nT9sxEc89pwsKqQzZcXQHs2Nn83nM56w7sA6AhuUb0j6svd8misw2\nK+0D1gBxrn8TX/OBezy4/7XA38m297j2JTceqGaM2QesB57OwLkqGZ03xs3jsjAGOneGmBg79cZL\nL0HjxrA1+zzGqJ8LN1+VReVrKjPwtoGs7bOWP/r/wZv/eZOz8Wd57tvnuG7kddw68VZG/jaSPSf3\n+OT+vpLq4xoish5Yb4yZJiIXruLanvxJ/zIQLSJNjDGVge+MMTUzcpMePXoQGhoKQEhICBEREUmd\nTokfBt3OWduJMnT+l18S9cor8L//0SQiAv77X6IiIiA42PHfJzPb0dHRfhWPk9vRrrXIfX2/l5u8\nzMuNX2bqvKlE/RnFmvg1PLvkWZ4d8yxhJcN47MHHaBfWjh3rdmTZ7x8VFUVkZCRA0vdlejzpc7gN\nGAqE4k4mIiJpPs9ljGkADEvWNDQISBCRd5Md8w3wpoj87NpeBgxw3SfNc137tVlJedf+/XZZ0vnz\n7eC5SZOgalWno1IBbtuRbcyOnc3s2NlEH7BJqkH5BklNT1m9Xra31nPYCjwDrAWS5r8VkX/SOS8X\ntlO5KbaJahVXdkh/CJwQkddca1WvAcKBk+md6zpfk4PyPhGYMQOefNL2Rbz2mp2nScdFKC9IKVHU\nv7Y+7cLa0S6sXZY8HutJckBE0nwBK9M7Jo1z78V+yW8HBrn29QH6uH4uAXyN7W/YCHRJ69wUri/K\nWr58udMh+A2vlcX+/SIPPigCIvXqiWza5J3rZiH9XLj5Y1lsO7JN3vrxLak1ppYwDGEYUm9cPXl3\nxbuy8+hOn93X9d2Z5ve3JzWHd4Bg4AvgXLKksjYDicontObgFqWDnZJ4tSxEYPZsO3ju5EkYMsR2\nXOcOjJXG9HPh5u9lsePoDubEzmHO5jms3rcagDpl6yTVKLw5hYe3mpWiSKFzWUTuzFR0XqDJQWWZ\nQ4fsI6+zZ0OtWrYvIiLC6ahUNrXr2K6kRLFq7yoAIspE0K6qTRQ3lbgpU9fX6TOU8ra5c6FfPzh6\nFAYNgsGDIW9ep6NS2difx/9k7ua5zImdkzTXU/VS1ZM6s8NKZnwKGG/VHIZiaw6GZDUIEXk9wxF5\nmSYHN3+vMmcln5fFkSPw7LPw2WdQrZqtRdyS5phQx+jnwi07lMWek3v4YvMXzImdkzR7bNUSVWlb\ntS3twtoRXjrco4WLvDK3EnDa9foXSMCOmg714Dylsqfixe3U3wsX2vUiGja0/RC6drXysfJFyvNU\n/af4seeP7H1uLx/f+zFlCpXhrRVvETE2giofV2HQ0kGs3reazP7hnOFmJWNMXuBbEbkjU3f2Aq05\nKMedOGETw7hxcOONMGEC3H6701GpHObQ6UPM2zKPOZvnsGznMi7KRSoWrZhUo6hfvj5Bxl0X8Emf\ngzHmGmCViDi++oUmB+U3li2DXr3sbK99+8I770CRIk5HpXKgo2ePMm/LPOZunst3O7/j/MXzlCtc\njgdvfpC2YW1pfF1jcgXn8kqfw8Zkm0FAKeB1Efm/zP8amaPJwS07tKd6i2Nlcfq0XY505EgoXx7G\njIEWLbI+jmT0c+GWE8viRNwJFvyxgLmb57J4+2LOxp+lVMFSHHrxkFf6HBLXjW4J3A2U84fEoJTf\nKVgQPvwQfvkFCheG++6Dbt3sIkNKOaBovqI8FP4QX3T8gsMvHmZ2+9n8p9J/PDrXo2YlY0wE0Bj7\ntNJPYiflc5zWHJTfOncO3n4b3nwTihWD//0POna0M8Eq5TBvrQT3NDAVKIldiGeqMeYp74SoVDaV\nNy8MGwZr10JoqJ0avFUr2BNY0zarnMuTZqXHgPoiMkREXgUaAL18G5bKqMunq87J/KosatSAX3+F\n4cNtp3VYGIwaBQkJWXJ7vyoLh2lZZIwnyQHs+IaUflZKpSc42K4wt2mTnQb8iSfs465btjgdmVKp\n8uRppeeAHtiJ9wzQBogUkRE+jy4d2uegAo6IHUD37LPup5teegny5HE6MpWDeG2cgzGmDnAb7g7p\ndd4JMXM0OaiAdfAgPP00zJoF1avD+PG2VqFUFvBWh3QDYJuIfCQi/wN2GGPqeytI5R3anuoWEGVR\nujTMnAlffw3Hj8Ott9rFhU6d8uptAqIssoiWRcZ40ucwBkj+iT3t2qeUyqyWLSE21k4H/skntsN6\n/nyno1LKoz6HaBGJuGzfBhEJ92lkHtBmJZWt/PabnYJj0yZo186OjShb1umoVDbkrVlZdxljnjLG\n5DbG5HGNe9jpnRCVUkkaNLDjIt580zY3Va1qJ/TLosdelUrOk+TwONAI2AvswY5z6O3LoFTGaXuq\nW0CXRe7c8PLLsGGDXXGuTx/72Gts7FVdLqDLwsu0LDIm3eQgIgdFpKOIlHK9OovIIU8uboxpbozZ\nYozZZowZkML7Lxhj1rleG40x8caYENd7u40xG1zvrcr4r6ZUAKtSBb7/3i4ktHmzXZL01VchLs7p\nyFQO4Umfw/vAG8BZYDFQE3hWRD5L57xgYCvQDFvr+B3oLCKbUzm+JfCMiDRzbe8C6ojI0TTuoX0O\nKvs7fNgOops61a4ZMXYs3On4Eu4qgHmrz+FuETmJnZV1N1AZeNGD824BtovIbhG5AMwEWqdxfBdg\nxmX7dJYypUqWtEuSfvut7X/4z3+gRw+d7VX5lCfJIZfr35bAHBE5QbK1pNNwLfB3su09rn1XMMYU\nAO4B5ibbLcBSY8xqY4zO5ZQObU91y7ZlcdddsHEjDBoE06bBzTfD5Ml21HUqsm1ZXAUti4zJlf4h\nfG2M2QLEAX2NMaVcP6cnI+099wMrROR4sn2NRGS/MaYk8J0xZouI/HT5iT169CA0NBSAkJAQIiIi\nkhb0SPww6HbO2k7kL/F4ffutt6BLF6I6dYIePWgSGQmjRxN14MAVx0dHRzsfr59sR0dH+1U8Wbkd\nFRVFZGQkQNL3ZXo8nT6jOHBcRC4aYwoChUXkQDrnNACGiUhz1/YgIEFE3k3h2C+BWSIyM5VrDQX+\nFZHhl+3XPgeVcyUkwMSJdm6mM2dg4EBbq8iXz+nIlJ/L1NxKxpimIrLMGNMWdy0g8WIiIl+kc/Nc\n2A7ppsA+YBUpdEgbY4pix02UF5Gzrn0FgGAROeVKRt8Cr4nIt5edq8lBqYMH4fnnbVPTjTfC6NHQ\ntKnTUSk/ltkO6dtd/97PpUuFtnT9nCYRiQf6A0uAWGzNYLMxpo8xpk+yQ9sASxITg0tp4CdjTDSw\nElhweWJQl7q8SSUny3FlUbq0fZIpscO6WTO7POnBgzmvLNKgZZExqfY5iMhQ1789rvbiIrIIWHTZ\nvrGXbU8GJl+2bxdwyZQdSql0JHZYv/02vPMOLFgAPXvaQXRBni7dopSVVrPS864fUzxARD70VVCe\n0mYlpVKxZQv06wfLl0P9+jBmjB1IpxSZb1YqDBQC6gJ9sY+hlsdOp1HbW0EqpXzg5pvtsqRTp8Ku\nXVCnjh1I5+UpwVX2lWpyEJFhIvIaUAGoLSLPi8hzQB2gYlYFqDyj7aluWhYuxhB17bW2FtG7N4wc\naSfzmzMnzbER2ZV+LjLGk4bIUsCFZNsXXPuUUoGgWDH7BNMvv9jR1u3bw733wvbtTkem/JgncysN\nBjpy6RrSs0TkLd+Hlzbtc1Aqg+LjYdQoeOUVOH/ejosYMEDHRuQw3l5DujG2c/pHXUNaqQC3b58d\nGzFzJtxwg12F7u67nY5KZRFvTbyHiKwRkZGudaT9IjGoS2l7qpuWhVuqZVGuHMyYYcdGGAP33GOb\nm/bsydL4spJ+LjJGH35WKidLHBvxxht2XMTNN8P778OFC+mfq7I1j5qV/JU2KynlRbt2wdNP2yVK\nw8JsU5NrEjeVvXitWUkplQNUqgTz59vXmTN2QaGHHoL9+52OTDlAk0M2oe2pbloWbldVFvffb9es\nfvVVOybippvsGIn4eK/Hl5X0c5ExmhyUUlfKnx9efx1iYqBRI3j2WahVC3780enIVBbJln0Oxujq\not4UyJ8R5QUiMG8ePPMM/PkndOliO63LlXM6MnWVvDbOwV+llRwC+ffyJ1qWKsmZM3a21/feg9y5\nYdgweOop+7MKKNohrXIkbVt282pZFChgm5o2bbLTgL/wgp3p9fvvvXcPH9LPRcZoclBKZcwNN9gx\nEfPm2dpE06bQoQP8/bfTkSkv0mYllSYtS5Wms2dt/8Pbb9sFhQYPttNy5M3rdGQqDdrnoDJNy1J5\nZPdumxS++AIqV4aPPoL77nM6KpUK7XNQOZK2LbtlWVmEhsLcuXaupty5oWVL+/KjacH1c5ExPk0O\nxpjmxpgtxphtxpgBKbz/gjFmneu10RgTb4wJ8eTcnObo0aM88MADFCpUiNDQUGbMmJHm8SNGjKBs\n2bIULVqURx99lPPnzye99/HHH1O3bl3y5ctHz549fR26yknuugvWr7dNTT/8ANWq2WnB//3X6chU\nRomIT15AMLAdCAVyA9FA1TSObwkszci5Nvwrpbbf31y4cMHjYzt16iSdOnWS06dPy4oVK6Ro0aIS\nExOT4rGLFy+W0qVLS2xsrBw7dkyaNGkiAwcOTHr/iy++kK+++kr69u0rPXr0SPO+gVKWyg/t2yfS\nvbsIiJQrJzJtmkhCgtNRKUn6/zrN73Bf1hxuAbaLyG4RuQDMBFqncXwXIPHP4YyeGzBCQ0N57733\nCA8Pp3Dhwly8eDHdc06fPs0XX3zBG2+8QYECBWjUqBGtW7fms88+S/H4yZMn89hjj1G1alVCQkIY\nMmQIkZGRSe8/8MADtG7dmuLFi3vr11LqSmXLwuTJdgW6smXtPE2NG8M6nfU/EOTy4bWvBZI/27YH\nqJ/SgcaYAsA9QL+Mnns1nnkGoqMzd42ICDvdzNWYOXMmixYtonjx4rRu3Zqff/45xeMaN27M/Pnz\n+eOPP8iVKxc33HBD0ns1a9ZMtQ01NjaWBx54IGk7PDycgwcPcuzYMYoVK5a0X7JpR3NUVBRNdDZR\nwE/KomFDWLUKPv3UNjHVqQO9esF//2uXLc0iflEWAcSXySEj3zz3AytE5HhGz+3RowehoaEAhISE\nEBERkYHbZj1jDE899RTXXnstAAsWLEj3nH///ZciRYpcsq9w4cKcOnUq1eOLFi2atJ147qlTpy5J\nDhmdZiQxGSX+D+av24EWry+3o6Oj/SOeoCCiKleGSZNosnQpfPwxUdOmQY8eNBkxAnLn9nk80a6/\nCP2iPLJ4OyoqKqn1IPH7Ml3ptTtd7QtoACxOtj0IGJDKsV8CnTJ6LgHY5xAaGipLly7N0Dlr166V\nAgUKXLLv/fffl/vvvz/F42vWrCmzZ89O2j58+LAYY+To0aOXHDd48GDtc1DOiIkRuftu2x9RtarI\nkiVOR5Sj4HCfw2rgRmNMqDEmD9ARmH/5QcaYosDtwLyMnhuokv/Ffu+991K4cOEUX/e5nhOvUqUK\n8fHxbE/2WOD69eupXr16itevVq1a0l9JiceWLl36klrD5XEolaXCwmDxYjvK+vx5u0xpq1Z+9ehr\nTuez5CAi8UB/YAkQC8wSkc3GmD7GmD7JDm0DLBGRs+md66tYnbRo0SJOnTqV4mvhwoUAFCxYkAcf\nfJAhQ4Zw5swZVqxYwddff023bt1SvGb37t2ZOHEimzdv5tixY7zxxhuXPLJ68eJF4uLiiI+P5+LF\ni5w7d86jjvFAoc+zu/l1WRhjE0JMDLz7LixfbpPGgAFw8qTXb+fXZeGP0qta+POLAG1WWrZsWYbP\nO3r0qLRp00YKFiwoFStWlBkzZiS99+eff0qhQoXk77//Ttr34YcfSunSpaVIkSLyyCOPyPnz55Pe\nGzp0qBhjLnm99tprKd7Xn8syNcuXL3c6BL8RUGWxb5/Iww/bpqbSpUUmTBCJj/fa5QOqLHwMD5qV\ndPoMlSYtS5Xlfv/dPlL4yy92gaGPPrKPwCqv0ekzlFKBp149WLECpk+Hw4ft9OAdOtj5m1SW0eSg\nsh1tW3YL2LIwBjp3hq1b7aJCCxbAzTfDK69c9VQcAVsWDtHkoJTyXwUKwNChNkm0bQtvvgk33mgH\n1CUkOB1dtqZ9DipNWpbKr/z2m+2PWLkSateGESNss5PKEO1zUEplLw0awK+/wrRptj/ijjugXTvY\nudPpyLIdTQ4q29G2ZbdsWRbGQJcusGULvPGGHUxXtSq89BKcOJHqadmyLHxIk4NSKjAVKGA7qP/4\nwyaLDz6w61uPHg3x8U5HF/C0z0GlSctSBYy1a+1SpVFRtiYxfDg0b25rGuoS2ueglMo5ateG77+H\nr76yNYcWLWxy2LjR6cgCkiaHAOHNZUKbNGlC/vz5kyb4q1q1qq/Dz1LatuyW48rCGGjdGjZtsguu\n/P67XXyld2+ivvjC6egCiiYHB8VnoF30iSeeIF++fBw6dIhp06bRt29fYmNjUzx2yZIlvPvuu3z/\n/ff8+eef7Ny5k6FDhya9b4zhk08+SZrgb/PmbDmnocrJ8uSBp5+2s7w+9RRERtqV6N54A86ccTq6\nwJDe5Ev+/CIAJ96rWLGivPvuu1KjRg3Jly+fxHswsdi///4refLkkW3btiXt6969+yXrQifXuXNn\nGTx4cNL2999/L2XKlEnabtKkiUyYMMGjeP25LJXy2LZtIm3bStJ61p9+6tVJ/QINOvFeyp5Z/AzR\nBzK3TmhEmQhGNs/4OqGhoaFcc801fP311xQvXpx27dqlu0zounXruO222zh9+nTSex9++CFRUVHM\nn3/lMhcREREMHjyY9u3bA3DkyBFKlizJkSNHKFasGHfeeScxMTGICDfddBNvvvkmd9xxR4oxaIe0\nylZWrLCd1qtW2eamDz6Apk2djirLaYe0H0q+TGi+fPlYsGABx44dS/GV+MXvzWVCAd5991127drF\nvn376N27N/fffz87s9EgohzXzp4GLQu3qKgouO02O8p6xgw4dgyaNbMd15s2OR2e3/HlGtJ+62r+\n4vemChUqZOj4QoUKcfKyxU9OnDhB4cKFPTr+hGtgUOLxt9xyS9J73bt3Z8aMGXzzzTf0798/Q3Ep\nFZCMgU6doE0b+PhjO19TzZrwyCPw+utQtqzTEfoFrTk4wF+WCc2uEhdYV1oWyV1RFvnywQsvuDut\nJ0+2g+iGDr3qmV+zlfQ6Jfz5RQB2SF/tSnCdOnWSzp07y+nTp+Wnn36SokWLSmxsbIrHLl68WMqU\nKSOxsbFy9OhRueOOO2TQoEEiInL8+HFZvHixnD17Vi5cuCBTp06VggULXtLZnZw/l6VSXrV9u0iH\nDpK0Et2YMSIXLjgdlU/gQYe0r7+8mwNbgG3AgFSOaQKsAzYBUcn27wY2uN5blcq5af3ifsnpZUIP\nHz4s9erVk8KFC0tISIg0bNhQli5dmup9/bksU6PLQbppWbh5XBa//irSqJH9erz5ZpGvvhJJSPBp\nbFnNk+Tgs6eVjDHBwFagGbAX+B3oLCKbkx0TAvwM3CMie4wxJUTkH9d7u4A6InI0jXtISvHrEzbe\nE4hlGRUVpc0pLloWbhkqCxGYNw8GDrRrSdx2G7z/vp0VNhvw5GklXyaHhsBQEWnu2h4IICLvJDum\nH1BGRIakcP4uoK6IHEnjHpocfEzLUuVo8fEwcaLthzh40E4P/tZbdsGhAOb0o6zXAn8n297j2pfc\njcA1xpjlxpjVxphuyd4TYKlrfy8fxqmUUinLlQv69LGd1sOGwaJFEBYGTzxhk0U25svk4Mmfm7mB\n2kAL4B7gVWNMYkq+TURqAfcCTxhjGvsmTJXd6LP9bloWbpkqi0KFbO1h+3Z47DEYOxYqV7YJI5Xx\nRoHOl+Mc9gLJH+ivgK09JPc38I+InAXOGmN+BGoC20RkH4CIHDbGfAncAvx0+U169OhBaGgoACEh\nIURERHj791Auif9zJbbb+ut2oMXry+3o6Gi/isfJ7cTHuzN9vdGj4dlnierVC157jSajRsGQIUTd\ndBPkzu03v2/y7aioKCIjIwGSvi/T48s+h1zYDummwD5gFVd2SN8MfIytNeQFVgIdsU8qBYvIKWNM\nQeBb4DUR+faye2ifg49pWSqVhpUr7Qp0P/5oaxJvvgnt20OQfw8hc7TPQUTigf7AEiAWmCUim40x\nfYwxfVzHbAEWYx9ZXQmMF5FYoAzwkzEm2rV/weWJQSmlHFe/vl1caOFCuzJdp05wyy2wdKnTkWVa\njpx4T3kuEMtSH99007Jw83lZXLwIU6fCkCHw11923qa334a6dX13z6vk9NNKSimVcwQHw8MP23ER\nI0bAunVQrx506ADbtjkdXYZpzUGlSctSqat08qSdEvzDDyEuzj7lNGQIlCvndGRac8hOMrJM6KZN\nm7jnnnsoWbIkQSl0jGV0yVGl1FUoUsTO8rpjB/TtC5Mm2Yn9Bg6004X7OU0ODvLVMqF58uShU6dO\nTJw4MdPXCkT6bL+bloWbY2VRujT83//Bli3Qti289x5cf73tj0i2gJffSW/yJX9+EYAT72XFMqGJ\ntm3bJq6mt6u+lj+XZWp0sjk3LQs3vymL9etFWra0E/uVKSPyySci585laQh4MPFejlzsh2eegejM\nLRNKRASMvLpFg2bOnMmiRYsoXrw4rVu3TneZ0D/++INcuXJxww03JL1Xs2bNq/pLyJvX8lf6dI6b\nloWb35RFeDh8/TX8/DMMGmSn4hg+HF57DTp3th3bfkCblbJYViwTmhZvXksplQmNGsEPP8A339j+\niW7d7Ip0X31lZ4V1WM6sOVzlX/ze4utlQrPqWv5Kn+1307Jw88uyMAbuvRfuuQfmzIFXX4UHHrAD\n6WNxtlkAAAfQSURBVN56C5o2dSw0rTk4wNfLhKbFm9dSSnlJUJAdDxETY6cI37/fDqJr2hR++82Z\nmNLrlPDnFwHYIZ0Vy4SKiJw9e1ZiYmLEGCNxcXESFxd3Vdfy57JUKts6e1bko49ESpa0Hdf33y8S\nHe21y+NBh7TWHALEqFGjOHv2LKVKlaJr166MGTOGqlWrAvDXX39RuHBh9uyxk97u3r2bAgUKUL16\ndYwx5M+fP+nY9K6llPID+fLBU0/Bzp3w3//aif0iIqBjRzsCOwvoCGmVpkAsS79sW3aIloVbQJfF\nsWP2iaaRI+HsWeje3a4v4eH025fTEdJKKZUdFCtmaxA7d9pH8WfMgCpVoF8/2LvXJ7fUmoNKk5al\nUn5o716bLCZMsOMi+vWz03KUKuXR6Z7UHDQ5qDRpWSrlx3btgjfegMmTbT/Fk0/Ciy9C8eJpnqbN\nSipHyk6jvTNLy8ItW5ZFpUp2Qr/Nm6FNGztvU6VKtj/i+PFMXVqTg1JKBboqVWDaNNi4Ee6+284G\nW6mSXbb0Kmc/0GYllSYtS6UC0Lp1MGwYzJ9vm5hefNHO4VSoEJDD+xyU9wTyZ0SpHO33322S+OYb\nKFkSBgyAvn0xBQs62+dgjGlujNlijNlmjBmQyjFNjDHrjDGbjDFRGTk3NemN/MuOr+XLl/tyJHpA\nyZZty1dJy8ItR5ZFvXqwcCH8+ivUqgUvvACVK3t0qs+SgzEmGPgYaA6EAZ2NMVUvOyYE+AS4X0Sq\nA+08PVddKjqzU5BnI1oWbloWbjm6LBo0gCVL4KefwMPZEHxZc7gF2C4iu0XkAjATaH3ZMV2AuSKy\nB0BE/snAuSqZ45l8MiE70bJw07Jw07IAbrsNvv/eo0N9mRyuBf5Otr3HtS+5G4FrjDHLjTGrjTHd\nMnCuUkopH/Hleg6eNFbnBmoDTYECwK/GmN88PFcls3v3bqdD8BtaFm5aFm5aFhnjs6eVjDENgGEi\n0ty1PQhIEJF3kx0zAMgvIsNc2xOAxdiaQprnuvZrElFKqauQ3tNKvqw5rAZuNMaEAvuAjkDny46Z\nB3zs6oDOC9QHPgT+8ODcdH85pZRSV8dnyUFE4o0x/YElQDAwUUQ2G2P6uN4fKyJbjDGLgQ1AAjBe\nRGIBUjrXV7EqpZS6VEAPglNKKeUbATu3UmYGyWUnxphJxpiDxpiNTsfiNGNMBdeTbzGuQZVPOR2T\nU4wx+YwxK40x0caYWGPM207H5CRjTLBrsO3XTsfiNGPMbmPMBld5rEr1uECsObj6KLYCzYC9wO9A\n55zY9GSMaQz8C0wRkRpOx+MkY0wZoIyIRBtjCgFrgDY58XMBYIwpICJnjDG5gBXACyKywum4nGCM\neQ6oAxQWkVZOx+MkY8wuoI6IHE3ruECtOeggORcR+Qk45nQc/kBEDohItOvnf4HNQDlno3KOiJxx\n/ZgH23eX5pdBdmWMKQ+0ACYA+hCLlW45BGpy0EFyKk2uJ91qASudjcQ5xpggY0w0cBBYnviwRw40\nAngR+9CLsuPIlroGHvdK7aBATQ6B1xamsoyrSWkO8LSrBpEjiUiCiEQA5YHbjTFNHA4pyxljWgKH\nRGQdWmtI1EhEagH3Ak+4mqavEKjJYS9QIdl2BWztQeVwxpjcwFxgqoh85XQ8/kBETgALgbpOx/L/\n7d1PiJVVHMbx7wNS/kEhFCQkItA0V4EooiDYkLgpECwUJHBV4EJauHGliAiudBf+WwghQTSYQeGf\naSEpCjK7AQsX0qJFqPgPhxp7WpyjDLyDczfe43WeD1zuve+8c+ccuHOfe97zvr/TwDrg03qc/Qzw\nkaTTjdvUlO2/6v3fwDDlMH3HoIbD8wvsJL1BuUjux8ZtisZUFvI4CYzZPtK6PS1JWlSrHiNpDvAx\nMNq2Vf1ne6/td2y/B2wDRmx/0bpdrUiaK2l+fTwP2ARMeabjQIaD7Qng2UVyY8B3M/iMlDPAFeB9\nSX9K2tm6TQ2tB3YAG+tpeqOSNrduVCNvAyN1zuEacM72pcZtehXM9EPSi4HLk94XP9k+P9WOA3kq\na0REvFwDOXKIiIiXK+EQEREdCYeIiOhIOEREREfCISIiOhIOERHRkXCIiIiOhENEA5LyvxevtFwE\nFzENSfuBu7aP1ucHKZVO3wQ+q/fDtvfVnw9T6n3NBo7aPl63PwK+oaxDsgv4pN4mgPO29/SxWxEv\nlHCImIakd4EfbK+q3/h/B/YCQ7a/rNvOAodtX5b0lu17tabRdWBDff4f8Lnt7yUtBH6zvaL+jQW2\nH7TpYURXhrYR07B9G7gj6UNKobJRYDWwSdIoZcW55cDS+iu7a+2aq5QRxLK6/SmlYizAfWBc0klJ\nW4AnfelMRI9mtW5AxIA4AeykFC47BQwBh2wfm7xTXTNhCFhre1zSr5TDSwDjrkN12xOS1tR9t1IK\nSQ71oyMRvUg4RPRmGDhAWW5zO2We4ICkb20/lrQE+AdYANyrwbACWDvVi9VyyfNs/yzpCnCrL72I\n6FHCIaIHtv+VNEL54DdwQdIHwNWyjAQPKeXCfwG+kjQG3KQcWnr+MpMezwfOSppNWaHs6z50I6Jn\nmZCO6EGddL4BbLWdb/nx2suEdMQ0JK0E/gAuJhhipsjIISIiOjJyiIiIjoRDRER0JBwiIqIj4RAR\nER0Jh4iI6Eg4REREx//N4uh5ss2MUwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f77576cde90>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "t = np.linspace(0, 5)\n",
    "for r in [0.01, 0.05, 0.1]:\n",
    "    plt.plot(t, discount_factor(r, t), label='r=%4.2f' % r, lw=1.5)\n",
    "plt.xlabel('years')\n",
    "plt.ylabel('discount factor')\n",
    "plt.grid(True)\n",
    "plt.legend(loc=0)\n",
    "# tag: disc_fact_1\n",
    "# title: Discount factors for different short rates over 5 years"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "collapsed": false,
    "uuid": "849b995a-8873-4a42-94c3-c638799d03e2"
   },
   "outputs": [],
   "source": [
    "class short_rate(object):\n",
    "    ''' Class to model a constant short rate object.\n",
    "    \n",
    "    Parameters\n",
    "    ==========\n",
    "    name : string\n",
    "        name of the object\n",
    "    rate : float\n",
    "        positive, constant short rate\n",
    "    \n",
    "    Methods\n",
    "    =======\n",
    "    get_discount_factors :\n",
    "        returns discount factors for given list/array\n",
    "        of dates/times (as year fractions)\n",
    "    '''\n",
    "    def __init__(self, name, rate):\n",
    "        self.name = name\n",
    "        self.rate = rate\n",
    "    def get_discount_factors(self, time_list):\n",
    "        ''' time_list : list/array-like '''\n",
    "        time_list = np.array(time_list)\n",
    "        return np.exp(-self.rate * time_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "collapsed": false,
    "uuid": "00abadb7-63af-4da6-a4f6-d80cc6ac1f75"
   },
   "outputs": [],
   "source": [
    "sr = short_rate('r', 0.05)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "collapsed": false,
    "uuid": "cb409ce7-30f9-4937-9ac9-85089ca4679f"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "('r', 0.05)"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sr.name, sr.rate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "collapsed": false,
    "uuid": "3ac0270c-9950-437c-bb46-65d1cbddf283"
   },
   "outputs": [],
   "source": [
    "time_list = [0.0, 0.5, 1.0, 1.25, 1.75, 2.0]  # in year fractions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "collapsed": false,
    "uuid": "cab9697b-e048-4452-bfb8-1090bb48c293"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.        ,  0.97530991,  0.95122942,  0.93941306,  0.91621887,\n",
       "        0.90483742])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sr.get_discount_factors(time_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": false,
    "uuid": "0ddbd6e4-8fd9-43e0-a256-5d1b880d3a05"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7f775753cb90>"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nSUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f77575f1810>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for r in [0.025, 0.05, 0.1, 0.15]:\n",
    "    sr.rate = r\n",
    "    plt.plot(t, sr.get_discount_factors(t),\n",
    "             label='r=%4.2f' % sr.rate, lw=1.5)\n",
    "plt.xlabel('years')\n",
    "plt.ylabel('discount factor')\n",
    "plt.grid(True)\n",
    "plt.legend(loc=0)\n",
    "# tag: disc_fact_2\n",
    "# title: Discount factors for different short rates over 5 years"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "collapsed": false,
    "uuid": "2acc982a-71a8-4505-bb98-61eb4c85d6b0"
   },
   "outputs": [],
   "source": [
    "sr.rate = 0.05\n",
    "cash_flows = np.array([-100, 50, 75])\n",
    "time_list = [0.0, 1.0, 2.0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "collapsed": false,
    "uuid": "1d1c180e-b8d2-41f9-9faf-55dd004a3606"
   },
   "outputs": [],
   "source": [
    "disc_facts = sr.get_discount_factors(time_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "collapsed": false,
    "uuid": "24992872-9aab-47dd-9c39-f8465e9f21fd"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.        ,  0.95122942,  0.90483742])"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "disc_facts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "collapsed": false,
    "uuid": "95fed5fe-b198-4790-9ba2-9219ce2d0510"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-100.        ,   47.56147123,   67.86280635])"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# present values\n",
    "disc_facts * cash_flows"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "collapsed": false,
    "uuid": "22d67111-86c5-438b-ac7f-2d746848ee5a"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "15.424277577732667"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# net present value\n",
    "np.sum(disc_facts * cash_flows)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "collapsed": false,
    "uuid": "25b83999-44c9-4d70-84ea-5ecbca23ade7"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-1.4032346276182679"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sr.rate = 0.15\n",
    "np.sum(sr.get_discount_factors(time_list) * cash_flows)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Cash Flow Series Class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "collapsed": false,
    "uuid": "27fec9d5-6849-4ef0-bd69-545e141eb888"
   },
   "outputs": [],
   "source": [
    "class cash_flow_series(object):\n",
    "    ''' Class to model a cash flows series.\n",
    "    \n",
    "    Attributes\n",
    "    ==========\n",
    "    name : string\n",
    "        name of the object\n",
    "    time_list : list/array-like\n",
    "        list of (positive) year fractions\n",
    "    cash_flows : list/array-like\n",
    "        corresponding list of cash flow values\n",
    "    short_rate : instance of short_rate class\n",
    "        short rate object used for discounting\n",
    "    \n",
    "    Methods\n",
    "    =======\n",
    "    present_value_list :\n",
    "        returns an array with present values\n",
    "    net_present_value :\n",
    "        returns NPV for cash flow series\n",
    "    '''\n",
    "    def __init__(self, name, time_list, cash_flows, short_rate):\n",
    "        self.name = name\n",
    "        self.time_list = time_list\n",
    "        self.cash_flows = cash_flows\n",
    "        self.short_rate = short_rate\n",
    "    def present_value_list(self):\n",
    "        df = self.short_rate.get_discount_factors(self.time_list)\n",
    "        return np.array(self.cash_flows) * df\n",
    "    def net_present_value(self):\n",
    "        return np.sum(self.present_value_list())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "collapsed": false,
    "uuid": "50136851-d7f8-467a-a04b-4b88bc6dc630"
   },
   "outputs": [],
   "source": [
    "sr.rate = 0.05\n",
    "cfs = cash_flow_series('cfs', time_list, cash_flows, sr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "collapsed": false,
    "uuid": "f6245d43-7dde-44b4-9b35-40eea1c6af66"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-100,   50,   75])"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cfs.cash_flows"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "collapsed": false,
    "uuid": "04da2bcd-a388-4830-a152-8ab6cd958e68"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.0, 1.0, 2.0]"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cfs.time_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "collapsed": false,
    "uuid": "7de29949-494c-4156-bbc9-4165cdb87e47"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-100.        ,   47.56147123,   67.86280635])"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cfs.present_value_list()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "collapsed": false,
    "uuid": "a7822201-d6b3-4715-9911-de550887f5e3"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "15.424277577732667"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cfs.net_present_value()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "collapsed": false,
    "uuid": "94f0003a-b9f3-4c92-b814-e0a6e6f9977c"
   },
   "outputs": [],
   "source": [
    "class cfs_sensitivity(cash_flow_series):\n",
    "    def npv_sensitivity(self, short_rates):\n",
    "        npvs = []\n",
    "        for rate in short_rates:\n",
    "            sr.rate = rate\n",
    "            npvs.append(self.net_present_value())\n",
    "        return np.array(npvs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "collapsed": false,
    "uuid": "523386c6-0394-40f2-88af-6dcc23b1f742"
   },
   "outputs": [],
   "source": [
    "cfs_sens = cfs_sensitivity('cfs', time_list, cash_flows, sr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {
    "collapsed": false,
    "uuid": "743dbb63-8728-49d5-83b0-f2213c37c4f8"
   },
   "outputs": [],
   "source": [
    "short_rates = [0.01, 0.025, 0.05, 0.075, 0.1, 0.125, 0.15, 0.2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "collapsed": false,
    "uuid": "bbb146fa-1f7a-459b-b89e-8baad84eda8a"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 23.01739219,  20.10770244,  15.42427758,  10.94027255,\n",
       "         6.64667738,   2.53490386,  -1.40323463,  -8.78945889])"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "npvs = cfs_sens.npv_sensitivity(short_rates)\n",
    "npvs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "collapsed": false,
    "uuid": "e96a2807-b45d-4c02-b5b6-6ca80026f340"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.text.Text at 0x7f77575e68d0>"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f77574e8b90>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(short_rates, npvs, 'b')\n",
    "plt.plot(short_rates, npvs, 'ro')\n",
    "plt.plot((0, max(short_rates)), (0, 0), 'r', lw=2)\n",
    "plt.grid(True)\n",
    "plt.xlabel('short rate')\n",
    "plt.ylabel('net present value')\n",
    "# tag: net_present_values\n",
    "# title: Net present values of cash flow list for different short rates"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Graphical User Interfaces"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Short Rate Class with GUI"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "collapsed": false,
    "uuid": "cb3a8b1f-056c-4e11-ac79-a3fb9993b3a6"
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import traits.api as trapi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "collapsed": false,
    "uuid": "fd5b94c8-8e5e-463c-994a-c23dc499967d"
   },
   "outputs": [],
   "source": [
    "class short_rate(trapi.HasTraits):\n",
    "    name = trapi.Str\n",
    "    rate = trapi.Float\n",
    "    time_list = trapi.Array(dtype=np.float, shape=(5,))\n",
    "    def get_discount_factors(self):\n",
    "        return np.exp(-self.rate * self.time_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "collapsed": false,
    "uuid": "7fa7e099-f1b7-4f35-b208-b25329debbb3"
   },
   "outputs": [],
   "source": [
    "sr = short_rate()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "collapsed": false,
    "uuid": "fbdbfc73-8170-454d-bea1-8a4f74b22787"
   },
   "outputs": [],
   "source": [
    "#remove sr.configure_traits()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "collapsed": false,
    "uuid": "a1baf3e6-0232-45ae-bac5-7118d656fdcf"
   },
   "outputs": [],
   "source": [
    "sr.name = 'sr_class'\n",
    "sr.rate = 0.05\n",
    "sr.time_list = [0.0, 0.5, 1.0, 1.5, 2.0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "collapsed": false,
    "uuid": "88ed3e63-db93-450c-a32a-ee0213ca5f6f"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.05"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sr.rate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "collapsed": false,
    "uuid": "63987530-cb67-4b1b-bd63-aec5390f6a67"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0. ,  0.5,  1. ,  1.5,  2. ])"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sr.time_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "collapsed": false,
    "uuid": "e160a704-8646-46ab-afb9-7f14e1ed682a"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.        ,  0.97530991,  0.95122942,  0.92774349,  0.90483742])"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sr.get_discount_factors()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Updating of Values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {
    "collapsed": false,
    "uuid": "931cb0eb-943e-4c28-bf91-d3d23b44362f"
   },
   "outputs": [],
   "source": [
    "#remove sr.configure_traits()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Cash Flows Series Class with GUI"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "collapsed": false,
    "uuid": "49f79623-3c0c-46f7-b426-c70a99e0f0da"
   },
   "outputs": [],
   "source": [
    "#remove cfs.configure_traits()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Conclusions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Further Reading"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"http://hilpisch.com/tpq_logo.png\" alt=\"The Python Quants\" width=\"35%\" align=\"right\" border=\"0\"><br>\n",
    "\n",
    "<a href=\"http://www.pythonquants.com\" target=\"_blank\">www.pythonquants.com</a> | <a href=\"http://twitter.com/dyjh\" target=\"_blank\">@dyjh</a>\n",
    "\n",
    "<a href=\"mailto:analytics@pythonquants.com\">analytics@pythonquants.com</a>\n",
    "\n",
    "**Python Quant Platform** |\n",
    "<a href=\"http://oreilly.quant-platform.com\">http://oreilly.quant-platform.com</a>\n",
    "\n",
    "**Derivatives Analytics with Python** |\n",
    "<a href=\"http://www.derivatives-analytics-with-python.com\" target=\"_blank\">Derivatives Analytics @ Wiley Finance</a>\n",
    "\n",
    "**Python for Finance** |\n",
    "<a href=\"http://shop.oreilly.com/product/0636920032441.do\" target=\"_blank\">Python for Finance @ O'Reilly</a>"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python2",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
